# 导入 pymysql 库，用于与 MySQL 数据库进行交互
import pymysql
# 导入 contextlib 库，该库提供了上下文管理器相关的工具
import contextlib
# 定义一个名为 DBHelper 的类，用于封装数据库操作相关的方法
class DBHelper():
    # 类的构造函数，目前为空，不执行任何初始化操作
    def __init__(self):
        pass
    # 使用 contextlib.contextmanager 装饰器将该方法转换为上下文管理器
    @contextlib.contextmanager
    def cursor(self, host="127.0.0.1", port=3306, user="root", passwd="123456", db="ceshi1", charset="utf8"):
        # 建立与 MySQL 数据库的连接，使用传入的参数或默认参数
        conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset=charset)
        # 创建一个游标对象，使用 DictCursor 模式，使查询结果以字典形式返回
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        # 打印分隔线，可用于调试时区分不同操作
        print("---------------")
        try:
            # 通过 yield 关键字将游标对象返回给使用该上下文管理器的代码块
            yield cursor
            # 如果代码块执行过程中没有抛出异常，提交数据库事务
            conn.commit()
        except Exception as e:
            # 如果发生异常，打印异常信息
            print(e)
            # 回滚数据库事务，撤销之前的操作
            conn.rollback()
        finally:
            # 无论是否发生异常，都关闭游标对象
            cursor.close()
            # 关闭数据库连接，释放资源
            conn.close()
    # 定义一个方法，用于执行 SQL 查询语句并返回所有查询结果
    def queAll(self, cursor, sql, params=None):
        # 执行传入的 SQL 查询语句，params 是可选的参数，用于防止 SQL 注入
        cursor.execute(sql, params)
        # 获取并返回所有查询结果
        return cursor.fetchall()
    # 定义一个方法，用于执行 SQL 语句（如插入、更新、删除等）并返回受影响的行数
    def execute(self, cursor, sql, params=None):
        # 执行传入的 SQL 语句，params 是可选的参数
        effn = cursor.execute(sql, params)
        # 返回受影响的行数
        return effn
# 主程序入口，当该脚本作为主程序运行时，以下代码会被执行
if __name__ == "__main__":
    # 创建 DBHelper 类的一个实例
    dbhelper = DBHelper()
    # 使用 with 语句调用 cursor 上下文管理器，获取游标对象
    with dbhelper.cursor() as cursor:
        # 调用 queAll 方法执行查询语句，查询 product 表中的所有记录
        # 注意：这里的 SQL 语句 "select*from product" 中 select 和 * 之间缺少空格，可能导致语法错误
        result = dbhelper.queAll(cursor, "select*from product")
        # 遍历查询结果列表
        for item in result:
            # 打印每条查询结果
            print(item)